home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2007 December / PCWKCD1207B.iso / Blogowanie poza sfera / Flock 1.0 beta / flock-1.0RC3.en-US.win32.exe / flock / components / flockRemoteConsoleLogger.js < prev    next >
Text File  |  2007-10-18  |  7KB  |  260 lines

  1. // vim: tabstop=2 softtabstop=2 shiftwidth=2 expandtab
  2. //
  3. // BEGIN FLOCK GPL
  4. // 
  5. // Copyright Flock Inc. 2005-2007
  6. // http://flock.com
  7. // 
  8. // This file may be used under the terms of of the
  9. // GNU General Public License Version 2 or later (the "GPL"),
  10. // http://www.gnu.org/licenses/gpl.html
  11. // 
  12. // Software distributed under the License is distributed on an "AS IS" basis,
  13. // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  14. // for the specific language governing rights and limitations under the
  15. // License.
  16. // 
  17. // END FLOCK GPL
  18. //
  19.  
  20. const CL_CONTRACTID = '@flock.com/remote-console-logger;1';
  21. const CL_CLASSID    = Components.ID('{70dc2acf-7e36-4a43-8f28-3e5f70613428}');
  22. const CL_CLASSNAME  = 'Flock Remote Console Logger';
  23.  
  24.  
  25. const ENABLED_BY_DEFAULT = false;
  26.  
  27. const LOGGING_URL = "http://exceptions.flock.com/log";
  28.  
  29. const PREF_FLOCK_LOG_ERRORS = "flock.remote_logging";
  30. const PREF_FLOCK_FIRSTRUN_UUID = "flock.firstrun.uuid";
  31.  
  32.  
  33. const Cc = Components.classes;
  34. const Ci = Components.interfaces;
  35. const Cr = Components.results;
  36.  
  37.  
  38. gApp     = null;
  39. gConsole = null;
  40.  
  41.  
  42. function getObserverService() {
  43.   return Cc['@mozilla.org/observer-service;1']
  44.     .getService(Ci.nsIObserverService);
  45. }
  46.  
  47.  
  48. function RemoteConsoleLogger() {
  49.   gApp = Cc['@mozilla.org/xre/app-info;1']
  50.     .getService(Ci.nsIXULAppInfo)
  51.     .QueryInterface(Ci.nsIXULRuntime);
  52.   gConsole = Cc['@mozilla.org/consoleservice;1']
  53.     .getService(Ci.nsIConsoleService);
  54.  
  55.   this._registered = false;
  56.  
  57.   this._listener = {
  58.     logger: this,
  59.     observe: function CLL_observe(obj) { this.logger._log(obj) }
  60.   };
  61.  
  62.   var obs = getObserverService();
  63.  
  64.   obs.addObserver(this, 'profile-after-change', false);
  65.   obs.addObserver(this, 'xpcom-shutdown', false);
  66.  
  67.   if (ENABLED_BY_DEFAULT)
  68.     this.observe(null, 'nsPref:changed', null);
  69. }
  70.  
  71. RemoteConsoleLogger.prototype = {
  72.   _start: function CL__start() {
  73.     var prefs = Cc['@mozilla.org/preferences-service;1']
  74.       .getService(Ci.nsIPrefBranch2);
  75.  
  76.     prefs.addObserver(PREF_FLOCK_FIRSTRUN_UUID, this, false);
  77.     prefs.addObserver(PREF_FLOCK_LOG_ERRORS, this, false);
  78.  
  79.     this.observe(null, 'nsPref:changed', null);
  80.   },
  81.   _configure: function CL__configure() {
  82.     var prefs = Cc['@mozilla.org/preferences-service;1']
  83.       .getService(Ci.nsIPrefBranch);
  84.  
  85.     var enabled;
  86.     try {
  87.       enabled = prefs.getBoolPref(PREF_FLOCK_LOG_ERRORS);
  88.     }
  89.     catch (e) {
  90.       /* disable by default always for dev builds */
  91.       if (gApp.appBuildID == '0000000000')
  92.         enabled = false;
  93.       else
  94.         enabled = ENABLED_BY_DEFAULT;
  95.     }
  96.  
  97.     var metrics = Cc["@flock.com/metrics-service;1"]
  98.                   .getService(Ci.flockIMetricsService);
  99.  
  100.     this._preamble = gApp.appBuildID + " " + metrics.getUserUUID() + "\n";
  101.  
  102.     if (enabled && !this._registered)
  103.       this._registerListener()
  104.     else if (!enabled && this._registered)
  105.       this._unregisterListener()
  106.   },
  107.   _shutdown: function CL__shutdown() {
  108.     gApp     = null;
  109.     gConsole = null;
  110.   },
  111.   _registerListener: function CL__registerListener() {
  112.     try {
  113.       gConsole.registerListener(this._listener);
  114.       this._registered = true;
  115.     }
  116.     catch (e) {
  117.       debug("Couldn't register with console service: " + e + "\n");
  118.     }
  119.   },
  120.   _unregisterListener: function CL__unregisterListener() {
  121.     try {
  122.       gConsole.unregisterListener(this._listener);
  123.       this._registered = false;
  124.     }
  125.     catch (e) {
  126.       debug("Couldn't unregister with console service: " + e + "\n");
  127.     }
  128.   },
  129.   _log: function CL__log(message) {
  130.     try {
  131.       var scriptError = message.QueryInterface(Ci.nsIScriptError);
  132.       if (scriptError.sourceName.indexOf('http:') != -1 ||
  133.           scriptError.sourceName.indexOf('https:') != -1)
  134.         return;
  135.  
  136.       var hr = Cc['@mozilla.org/xmlextras/xmlhttprequest;1']
  137.         .createInstance(Ci.nsIXMLHttpRequest);
  138.       hr.backgroundRequest = true;
  139.       hr.open('POST', LOGGING_URL);
  140.       hr.send(this._preamble + scriptError.toString() + '\n');
  141.     }
  142.     catch (e) {
  143.       // Something bad happened, just ignore it
  144.     }
  145.   },
  146.  
  147.   observe: function CL_observe(subject, topic, state) {
  148.     var obs = getObserverService();
  149.  
  150.     switch (topic) {
  151.       case 'profile-after-change':
  152.         obs.removeObserver(this, 'profile-after-change');
  153.         this._start();
  154.         break;
  155.  
  156.       case 'xpcom-shutdown':
  157.         obs.removeObserver(this, 'xpcom-shutdown');
  158.         this._shutdown();
  159.         break;
  160.  
  161.       case 'nsPref:changed':
  162.         this._configure();
  163.         break;
  164.     }
  165.   },
  166.  
  167.   getInterfaces: function CL_getInterfaces(countRef) {
  168.     var interfaces = [Ci.nsIObserver, Ci.nsIClassInfo, Ci.nsISupports];
  169.     countRef.value = interfaces.length;
  170.     return interfaces;
  171.   },
  172.   getHelperForLanguage: function CL_getHelperForLanguage(language) {
  173.     return null;
  174.   },
  175.   contractID: CL_CONTRACTID,
  176.   classDescription: CL_CLASSNAME,
  177.   classID: CL_CLASSID,
  178.   implementationLanguage: Ci.nsIProgrammingLanguage.JAVASCRIPT,
  179.   flags: Ci.nsIClassInfo.SINGLETON,
  180.  
  181.   QueryInterface: function CL_QueryInterface(iid) {
  182.     if (iid.equals(Ci.nsIObserver) ||
  183.         iid.equals(Ci.nsIClassInfo) ||
  184.         iid.equals(Ci.nsISupports))
  185.       return this;
  186.     throw Cr.NS_ERROR_NO_INTERFACE;
  187.   }
  188. }
  189.  
  190.  
  191. function GenericComponentFactory(ctor) {
  192.   this._ctor = ctor;
  193. }
  194.  
  195. GenericComponentFactory.prototype = {
  196.  
  197.   _ctor: null,
  198.  
  199.   // nsIFactory
  200.   createInstance: function(outer, iid) {
  201.     if (outer != null)
  202.       throw Cr.NS_ERROR_NO_AGGREGATION;
  203.     return (new this._ctor()).QueryInterface(iid);
  204.   },
  205.  
  206.   // nsISupports
  207.   QueryInterface: function(iid) {
  208.     if (iid.equals(Ci.nsIFactory) ||
  209.         iid.equals(Ci.nsISupports))
  210.       return this;
  211.     throw Cr.NS_ERROR_NO_INTERFACE;
  212.   },
  213. };
  214.  
  215. var Module = {
  216.   QueryInterface: function(iid) {
  217.     if (iid.equals(Ci.nsIModule) ||
  218.         iid.equals(Ci.nsISupports))
  219.       return this;
  220.  
  221.     throw Cr.NS_ERROR_NO_INTERFACE;
  222.   },
  223.  
  224.   getClassObject: function(cm, cid, iid) {
  225.     if (!iid.equals(Ci.nsIFactory))
  226.       throw Cr.NS_ERROR_NOT_IMPLEMENTED;
  227.  
  228.     if (cid.equals(CL_CLASSID))
  229.       return new GenericComponentFactory(RemoteConsoleLogger)
  230.  
  231.     throw Cr.NS_ERROR_NO_INTERFACE;
  232.   },
  233.  
  234.   registerSelf: function(cm, file, location, type) {
  235.     var cr = cm.QueryInterface(Ci.nsIComponentRegistrar);
  236.     cr.registerFactoryLocation(CL_CLASSID, CL_CLASSNAME, CL_CONTRACTID,
  237.                                file, location, type);
  238.  
  239.     var catman = Cc['@mozilla.org/categorymanager;1']
  240.       .getService(Ci.nsICategoryManager);
  241.     catman.addCategoryEntry('app-startup', CL_CLASSNAME,
  242.                             'service,' + CL_CONTRACTID,
  243.                             true, true);
  244.   },
  245.  
  246.   unregisterSelf: function(cm, location, type) {
  247.     var cr = cm.QueryInterface(Ci.nsIComponentRegistrar);
  248.     cr.unregisterFactoryLocation(CL_CLASSID, location);
  249.   },
  250.  
  251.   canUnload: function(cm) {
  252.     return true;
  253.   },
  254. };
  255.  
  256. function NSGetModule(compMgr, fileSpec)
  257. {
  258.   return Module;
  259. }
  260.